package service;

import controladoresJpa.exceptions.PreexistingEntityException;
import java.util.logging.Level;
import java.util.logging.Logger;
import service.AtributoMRService;
import controladoresJpa.TabelaJpaController;
import controladoresJpa.exceptions.IllegalOrphanException;
import controladoresJpa.exceptions.NonexistentEntityException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import model.AssociacaoTabelaAtributo;
import model.AtributoMR;
import model.Tabela;
import service.AssociacaoTabelaAtributoService;

/**
 * Módulo MR
 * Classe Service para construção de métodos de acesso a Tabela
 * @author Eduardo, Maylon e Kamilla
 */
public class TabelaService  implements Serializable{

	private TabelaJpaController jpa;
        private static Logger log = Logger.getLogger(TabelaService.class.getName());
        
        /**
         * Método Construtor
         */
        public TabelaService() {
            jpa = new TabelaJpaController();
        }

        /**
         * Método responsável por salvar e atualizar um Atributo do Modelo Entidade-Relacionamento.
         * @param tabela atributo a ser salvo.
         * @throws NonexistentEntityException exceção NonexistentEntityException.
         * @throws Exception exceção.
         */
        public void salvar(Tabela tabela) {
            if(this.encontrado(tabela)){
            try {
                jpa.edit(tabela);
                log.fine("A Tabela: "+ tabela.getNome()+" foi editada com sucesso");
            } catch (IllegalOrphanException ex) {
                Logger.getLogger(TabelaService.class.getName()).log(Level.SEVERE, null, ex);
            } catch (NonexistentEntityException ex) {
                Logger.getLogger(TabelaService.class.getName()).log(Level.SEVERE, null, ex);
            } catch (Exception ex) {
                Logger.getLogger(TabelaService.class.getName()).log(Level.SEVERE, null, ex);
            }
            }
            else{
            try {
                jpa.create(tabela);
                log.info("A Tabela: "+ tabela.getNome()+" foi salva com sucesso");
            } catch (PreexistingEntityException ex) {
                Logger.getLogger(TabelaService.class.getName()).log(Level.SEVERE, null, ex);
            } catch (Exception ex) {
                Logger.getLogger(TabelaService.class.getName()).log(Level.SEVERE, null, ex);
            }
            }
        }

         
         /**
         * Método responsável por excluir um Atributo do Modelo Entidade-Relacionamento.
         * @param objeto atriubuto a ser excluido.
         * @throws NonexistentEntityException exceção NonexistentEntityException.
         */
        public void excluir(Tabela objeto) {
            if(this.encontrado(objeto))
                try {
            jpa.destroy(objeto.getNome());
            log.info("A Tabela: "+ objeto.getNome()+" foi excluida com sucesso");
        } catch (IllegalOrphanException ex) {
            Logger.getLogger(TabelaService.class.getName()).log(Level.SEVERE, null, ex);
        } catch (NonexistentEntityException ex) {
            Logger.getLogger(TabelaService.class.getName()).log(Level.SEVERE, null, ex);
        } 
        }

        /**
         * Método para listar os esquemas já existentes
         * @return 
         */
        public List<Tabela> recarregar() {
            return jpa.findTabelaEntities();
        }
    
        /**
         * Método para procura de um esquema
         * @param objeto
         * @return 
         */
        public boolean encontrado(Tabela objeto){
            List lst = jpa.findTabelaEntities();
            Iterator i = lst.iterator();
            boolean achei = false;
            while(!achei && i.hasNext()){
                Tabela a = (Tabela) i.next();
                if(objeto.getNome().equals(a.getNome())){
                    log.fine("A Tabela: "+ objeto.getNome()+" foi encontrada");
                    return true;
                }
            }
            log.fine("A Tabela: "+ objeto.getNome()+" não foi encontrada");
            return false;
        }
        
     /**
      * Método para recuperaçao de esquemas do BD
      * @param objeto
      * @return 
      */
        public Tabela recuperarDoBancoDados(Tabela objeto){
            List lst = jpa.findTabelaEntities();
            Iterator i = lst.iterator();
            boolean achei = false;
            while(!achei && i.hasNext()){
                Tabela a = (Tabela) i.next();
                if(objeto.getNome().equals(a.getNome())){
                    log.fine("A Tabela: "+ objeto.getNome()+" foi encontrada no BD");
                    return a;
                }
                    
            }
            log.fine("A Tabela: "+ objeto.getNome()+" Não foi encontrada no BD");
            return null;
        }
}
